#include "smart_ptr.hpp"
#include <thread>

// int main()
// {
//     smart_ptr::auto_ptr<int> p1(new int);
//     *p1 = 10;
//     smart_ptr::auto_ptr<int> p2(p1);
//     *p2 = 20;

//     smart_ptr::unique_ptr<int> p3(new int);
//     *p3 = 10;

//     smart_ptr::shared_ptr<int> p4(new int);
//     std::cout << p4.Cnt() << std::endl;
//     smart_ptr::shared_ptr<int> p5(p4);
//     std::cout << p4.Cnt() << std::endl;
//     std::cout << p5.Cnt() << std::endl;
//     {
//     smart_ptr::shared_ptr<int> p6(new int);
//     p6 = p5;
//     std::cout << p5.Cnt() << std::endl;
//     }
//     std::cout << p4.Cnt() << std::endl;
//     std::cout << p5.Cnt() << std::endl;

//     return 0;
// }
#include <functional> 
void func(smart_ptr::shared_ptr<int>& sp, size_t n)
{
	for (size_t i = 0; i < n; i++)
	{
		smart_ptr::shared_ptr<int> copy(sp);
	}
}
int main()
{
	smart_ptr::shared_ptr<int> p(new int(0));

	const size_t n = 1000;
	std::thread t1(func, std::ref(p), n);
	std::thread t2(func, std::ref(p), n);

	t1.join();
	t2.join();

	std::cout << p.Cnt() << std::endl; //预期：1

	return 0;
}
